package org.ehe.finance.payable.listener;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ehe.finance.payable.event.DueReminderEvent;
import org.ehe.finance.payable.event.PayableCreatedEvent;
import org.ehe.finance.payable.event.PaymentMadeEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * @author :zhangnn
 * @className :PayableEventListener
 * @description: TODO
 * @date 2025-09-02 10:55:12
 */


@Slf4j
@Component
@RequiredArgsConstructor
public class PayableEventListener {
    @Async
    @EventListener
    public void handlePayableCreated(PayableCreatedEvent event) {
        log.info("处理应付账款创建事件 - 单据号: {}, 供应商ID: {}, 金额: {}",
            event.getBillNo(), event.getSupplierId(), event.getAmount());

        try {
            // 这里可以添加业务逻辑，如：
            // 1. 发送通知给财务人员
            // 2. 更新供应商信用额度
            // 3. 记录操作日志
            // 4. 触发工作流

            // 示例：记录审计日志
            recordAuditLog("PAYABLE_CREATED", event.getBillNo(),
                "创建应付账款，金额：" + event.getAmount());

        } catch (Exception e) {
            log.error("处理应付账款创建事件失败 - 单据号: {}", event.getBillNo(), e);
        }
    }

    @Async
    @EventListener
    public void handlePaymentMade(PaymentMadeEvent event) {
        log.info("处理付款事件 - 单据号: {}, 付款金额: {}, 剩余金额: {}",
            event.getBillNo(), event.getPaymentAmount(), event.getRemainingAmount());

        try {
            // 这里可以添加业务逻辑，如：
            // 1. 更新现金流记录
            // 2. 发送付款确认通知
            // 3. 更新供应商账期统计
            // 4. 如果完全结清，发送结清通知

            if (event.getRemainingAmount().compareTo(BigDecimal.ZERO) == 0) {
                // 已完全结清
                log.info("应付账款已完全结清 - 单据号: {}", event.getBillNo());
                sendSettlementNotification(event.getBillNo());
            }

        } catch (Exception e) {
            log.error("处理付款事件失败 - 单据号: {}", event.getBillNo(), e);
        }
    }

    @Async
    @EventListener
    public void handleDueReminder(DueReminderEvent event) {
        log.info("处理到期提醒事件 - 单据号: {}, 到期日期: {}, 未付金额: {}",
            event.getBillNo(), event.getDueDate(), event.getUnpaidAmount());

        try {
            // 这里可以添加业务逻辑，如：
            // 1. 发送邮件提醒
            // 2. 发送短信提醒
            // 3. 在系统中创建待办事项
            // 4. 更新紧急程度标识

            sendDueReminderNotification(event);

        } catch (Exception e) {
            log.error("处理到期提醒事件失败 - 单据号: {}", event.getBillNo(), e);
        }
    }

    private void recordAuditLog(String action, String billNo, String description) {
        // 记录审计日志的具体实现
        log.debug("记录审计日志 - 操作: {}, 单据号: {}, 描述: {}", action, billNo, description);
    }

    private void sendSettlementNotification(String billNo) {
        // 发送结清通知的具体实现
        log.debug("发送结清通知 - 单据号: {}", billNo);
    }

    private void sendDueReminderNotification(DueReminderEvent event) {
        // 发送到期提醒通知的具体实现
        log.debug("发送到期提醒通知 - 单据号: {}, 到期日期: {}",
            event.getBillNo(), event.getDueDate());
    }
}
